package com.ntd.study.protocol.netty;

import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import ntd.util.UtilLog;

import java.nio.charset.Charset;

/**
 * 链接消息处理类
 */
@ChannelHandler.Sharable // 标识这类的实例之间可以在 channel 里面共享
public class ChannelHandler extends ChannelInboundHandlerAdapter {

    /**
     * 读操作时捕获到异常时调用
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }

    /**
     * 每个信息入栈都会调用
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf byteBuf = (ByteBuf) msg;
        UtilLog.info("收到消息 - " + byteBuf.toString(Charset.forName("utf-8")));
    }

    /**
     * 通知处理器最后的 channelRead() 是当前批处理中的最后一条消息时调用
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        super.channelReadComplete(ctx);
    }

    /***
     * 建立新连接时调用
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        // 获取链接
        Channel channel = ctx.channel();
        UtilLog.info("新连接");
        UtilLog.info("客户端地址 - " + channel.remoteAddress());

    }
}
